package datajudge

import (
	"math"
)

// 数据状态类型
type DataStatus string

const (
	StatusNormal   DataStatus = "normal"   // 正常 (1.5σ内)
	StatusAbnormal DataStatus = "abnormal" // 异常 (1.5σ--3σ)
	StatusError    DataStatus = "error"    // 错误 (超出3σ)
)

// μ和σ信息结构体
type MetaInfo struct {
	Mu    float64 `json:"mu"`    // 均值
	Sigma float64 `json:"sigma"` // 标准差
}

// 数据分析结果
type AnalysisResult struct {
	Value     float64    `json:"value"`     // 原始数据值
	Status    DataStatus `json:"status"`    // 数据状态
	Deviation float64    `json:"deviation"` // 偏差倍数（几倍σ）
	Mu        float64    `json:"mu"`        // 均值
	Sigma     float64    `json:"sigma"`     // 标准差
}

// 判断单个数据状态
// 参数:
//   - value: 实际数据值
//   - mu: 均值(μ)
//   - sigma: 标准差(σ)
//
// 返回: DataStatus (normal/abnormal/error)
func JudgeDataStatus(value, mu, sigma float64) DataStatus {
	if sigma == 0 {
		return StatusNormal // 避免除零错误
	}

	deviation := math.Abs(value-mu) / sigma

	if deviation <= 1.5 {
		return StatusNormal
	} else if deviation <= 3.0 {
		return StatusAbnormal
	} else {
		return StatusError
	}
}

// 分析单个参数并返回详细结果
// 参数:
//   - value: 实际数据值
//   - mu: 均值(μ)
//   - sigma: 标准差(σ)
//
// 返回: AnalysisResult 包含完整的分析信息
func AnalyzeSingleParameter(value, mu, sigma float64) AnalysisResult {
	status := JudgeDataStatus(value, mu, sigma)

	var deviation float64
	if sigma != 0 {
		deviation = math.Abs(value-mu) / sigma
	}

	return AnalysisResult{
		Value:     value,
		Status:    status,
		Deviation: deviation,
		Mu:        mu,
		Sigma:     sigma,
	}
}

// 批量分析多个参数
// 参数:
//   - data: map[参数名]数据值
//   - meta: map[参数名]MetaInfo
//
// 返回: map[参数名]AnalysisResult
func AnalyzeMultipleParameters(data map[string]float64, meta map[string]MetaInfo) map[string]AnalysisResult {
	results := make(map[string]AnalysisResult)

	for param, value := range data {
		if metaInfo, exists := meta[param]; exists {
			results[param] = AnalyzeSingleParameter(value, metaInfo.Mu, metaInfo.Sigma)
		}
	}

	return results
}

// 检查是否有异常数据
func HasAbnormalData(results map[string]AnalysisResult) bool {
	for _, result := range results {
		if result.Status == StatusAbnormal {
			return true
		}
	}
	return false
}

// 检查是否有错误数据
func HasErrorData(results map[string]AnalysisResult) bool {
	for _, result := range results {
		if result.Status == StatusError {
			return true
		}
	}
	return false
}

// 获取统计信息
type StatsSummary struct {
	Total    int `json:"total"`    // 总参数数量
	Normal   int `json:"normal"`   // 正常参数数量
	Abnormal int `json:"abnormal"` // 异常参数数量
	Error    int `json:"error"`    // 错误参数数量
}

// 获取数据状态统计
func GetStatusStatistics(results map[string]AnalysisResult) StatsSummary {
	stats := StatsSummary{}

	for _, result := range results {
		stats.Total++
		switch result.Status {
		case StatusNormal:
			stats.Normal++
		case StatusAbnormal:
			stats.Abnormal++
		case StatusError:
			stats.Error++
		}
	}

	return stats
}
